package com.achao.basecommon.service.impl;

import com.achao.basecommon.service.CommonService;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;

/**
 * @Description：公共业务层-实现类
 * @date：2023/8/9 16:28
 */
@Service
public class CommonServiceImpl implements CommonService {

    //局部限制长度(每达到这个条数插入一批)
    private static final Integer partialLimit = 300;

    /**
     *  @Description：批量插入通用方法
     *  /**
     *  *  @Description：批量->分批插入通用方法(先删表再全量插入的业务适合此方法)
     *      *  @Param：M
     *      *  @Param：Consumer<M>
     *      *  @Param：List<T>
     *      *  @Param：Consumer<List<T>>
     *      *  @Returen：void
     *    使用方式：batchHandle(null, businessUnitDao::delete,ListData,businessUnitDao::saveBatch);
     */
    @Override
    public <T,M> void batchHandle(M param, Consumer<M> deleteMapper, List<T> insertList, Consumer<List<T>> insertMapper){
        deleteMapper.accept(param);
        List<T> batchList = new ArrayList<>();
        for(int i = 0; i < insertList.size(); i++){
            batchList.add(insertList.get(i));
            if (Objects.equals(batchList.size(), partialLimit) || Objects.equals(insertList.size() - 1, i)) {
                //执行批量插入语句
                insertMapper.accept(batchList);
                // 执行完了处理逻辑之后,将 batchList 的元素清空
                batchList.clear();
            }
        }
    }

}
